package com.tang.juc.util;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author tlm
 * @version 1.0
 * @date 2020/3/18 19:24
 * 加法计数器  CyclicBarrier
 *
 * CountDownLatch和CyclicBarrier区别：
 * 1.countDownLatch是一个计数器，线程完成一个记录一个，计数器递减，只能只用一次
 * 2.CyclicBarrier的计数器更像一个阀门，需要所有线程都到达，然后继续执行，计数器递增，提供reset功能，可以多次使用
 */
public class CyclicBarrierTest {
    public static void main(String[] args) {
        //模拟 当10个玩家都准备后 游戏开始 玩家依次加入游戏。
        CyclicBarrier cyclicBarrier = new CyclicBarrier(10, () -> {
            System.out.println("10名玩家已够，将马上开启对局");
        });
        for (int i = 1; i <= 10; i++) {
            final int temp = i;
            new Thread(() -> {
                System.out.println("玩家" + Thread.currentThread().getName() + "已准备");
                try {
                    //等待
                    cyclicBarrier.await();
                    // 线程数量达到计数器指定的值才会执行后面的语句
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("玩家" + Thread.currentThread().getName() + "加入游戏");
            }).start();
        }
        /*
        输出结果：
玩家Thread-0已准备
玩家Thread-4已准备
玩家Thread-3已准备
玩家Thread-2已准备
玩家Thread-1已准备
玩家Thread-5已准备
玩家Thread-6已准备
玩家Thread-9已准备
玩家Thread-7已准备
玩家Thread-8已准备
10名玩家已够，将马上开启对局
玩家Thread-8加入游戏
玩家Thread-0加入游戏
玩家Thread-4加入游戏
玩家Thread-1加入游戏
玩家Thread-6加入游戏
玩家Thread-2加入游戏
玩家Thread-3加入游戏
玩家Thread-7加入游戏
玩家Thread-9加入游戏
玩家Thread-5加入游戏
         */

    }
}
